/*
 * @Author: zi.yang
 * @Date: 2021-10-02 13:48:31
 * @LastEditors: zi.yang
 * @LastEditTime: 2021-10-02 13:53:46
 * @Description: In User Settings Edit
 * @FilePath: \ziYangPM\src\apis\index.js
 */
import MessageInterceptor from '@/Utils/messageInterceptor'

const isDev = process.env.VUE_APP_ENV !== 'production'
const apiInter = new MessageInterceptor()

const moduleList = []
// 检查 Api 接口名称是否重复
function checkApiNameIsDuplicate (modulePath, apiList) {
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  Object.keys(apiList).forEach((apiName) => {
    if (!apiInter.checkQueue(apiName)) {
      apiInter.enqueue(apiName)
      moduleList.push({ moduleName, apiName })
    } else {
      const module = moduleList.find((item) => item.apiName === apiName)
      throw new Error(
        `Api ${apiName} 接口异常，方法名重复：
    ${moduleName} 模块中与 ${module.moduleName} 模块中均存在该方法，请将其中一个模块的方法进行命名！`
      )
    }
  })
}

/**
 * 接口命名规范
 *
 * api 请求统一 fetch 前缀
 * 查询数据 ： fetch xxxx ''|Find|Get
 * 更新数据 ： fetch xxxx Update|Put|Patch
 * 删除数据 ： fetch xxxx Delete
 * 新增数据 ： fetch xxxx Add|Create|Save
 * 上传文件 :  fetch xxxx Upload
 * 下载文件 ： fetch xxxx Download
 * 导入数据 ： fetch xxxx Import
 * 导出数据 ： fetch xxxx Export
 */
const modulesFiles = require.context('./api', true, /\.js$/)
const modules = modulesFiles.keys().reduce((module, modulePath) => {
  const value = modulesFiles(modulePath)
  if (isDev) {
    checkApiNameIsDuplicate(modulePath, value.default)
  }
  return Object.assign(module, value.default)
}, {})

export default modules
